#include <stdio.h>
#include <stdlib.h>

struct no {
  int v;
  struct no* prox;
};

typedef struct no No;

struct fila {
  No* inicio;
  No* fim;
};
typedef struct fila Fila;

void imprime_fila(Fila f) {
  No* l = f.inicio;
  printf("(");
  if (l != NULL) {
    printf("%d", l->v);
    l = l->prox;
  }
  while (l != NULL) {
    printf(", %d", l->v);
    l = l->prox;
  }
  printf(")\n");
}

void inicia_fila (Fila *ap_f) {
  ap_f->inicio = NULL;
  ap_f->fim = NULL;
}

void insere_fila(Fila *ap_f, int v) {
  No *n;
  n = (No*) malloc(sizeof(No));
  n->v = v;
  n->prox = NULL;  /* Ultimo elemento da fila */
  if (ap_f->inicio == NULL) {
    ap_f->inicio = n;
    ap_f->fim = n;
  } else {
    ap_f->fim->prox = n;
    ap_f->fim = n;
  }
}

/* Retorna o valor do elemento removido ou -1 caso
   a fila esteja vazia. */
int remove_fila(Fila *f) {
  No* n;
  int v;

  if (f->inicio == NULL)
    return -1;
  n = f->inicio;
  f->inicio = n->prox;
  if (f->inicio == NULL)
    f->fim = NULL; 
  v = n->v;
  free(n);
  return v;
}


int main() {
  Fila f;

  inicia_fila(&f);

  insere_fila(&f, 1);
  imprime_fila(f);
  insere_fila(&f, 3);
  imprime_fila(f);
  insere_fila(&f, 5);
  imprime_fila(f);
  
  while (remove_fila(&f) != -1)
    imprime_fila(f);

  return 0;
  
}
